class Flow {
      constructor(a) {
        this.callbacks = a;
      }
      next=()=>{
        if(this.callbacks.length==0)return
        let f = this.callbacks.shift();
  
        try {
          f().then(this.next);
        } catch (error) {
          this.next()
        }
      }
      run(callback) {
        this.callbacks.push(callback)
        this.next()
      }
    }
  
    function createFlow(arr) {
      let a = [];
      arr.forEach(item => {
        if (item instanceof Flow) {
          a = a.concat(item.callbacks)
        }
        if (typeof item == 'function') {
          a.push(item)
        }
        if (Array.isArray(item)) {
          a = a.concat(item)
        }
      })
      return new Flow(a)
    }
    //---------------------------------------------
    let log = console.log;
    const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
  
    const subFlow = createFlow([() => delay(1000).then(() => log("c"))]);
  
    let res = createFlow([
      () => log("a"),
      () => log("b"),
      subFlow,
      [() => delay(1000).then(() => log("d")), () => log("e")],
    ])
    res.run(() => {
      console.log("done");
    });
    // console.log(res,subFlow)
  
    // 需要按照 a,b,延迟1秒,c,延迟1秒,d,e, done 的顺序打印